{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "cFTZFusSyqOV"
      },
      "outputs": [],
      "source": [
        "import os\n",
        "import pickle\n",
        "import numpy as np\n",
        "from tqdm.notebook import tqdm\n",
        "import pandas as pd\n",
        "import matplotlib.pyplot as plt"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "from tensorflow.keras.preprocessing.image import load_img , img_to_array\n",
        "from tensorflow.keras.preprocessing.text import Tokenizer\n",
        "from tensorflow.keras.preprocessing.sequence import pad_sequences\n",
        "from tensorflow.keras.models import Model\n",
        "from tensorflow.keras.utils import to_categorical , plot_model\n",
        "from tensorflow.keras.layers import Input , Dense , LSTM , Embedding , Dropout , add\n"
      ],
      "metadata": {
        "id": "_Bz9juKZZNNC"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "from google.colab import drive\n",
        "drive.mount(\"/content/drive\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "usmg6wpa0Qjf",
        "outputId": "6edf0250-7a87-4b05-d251-ec1004e2cfc7"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "def excel_to_data(pathxy) :\n",
        "\n",
        "  df = pd.read_excel(pathxy)\n",
        "\n",
        "  df = df.drop(columns = \"ID\")\n",
        "\n",
        "  dfx = pd.DataFrame(df.iloc[:,::2])\n",
        "  dfy = pd.DataFrame(df.iloc[:,1::2])\n",
        "\n",
        "  x_input = dfx.to_numpy()\n",
        "  y_input = dfy.to_numpy()\n",
        "\n",
        "  f_x = np.zeros((20,64))\n",
        "  f_x[:x_input.shape[0],:x_input.shape[1]] = x_input\n",
        "\n",
        "  f_y = np.zeros((20,64))\n",
        "  f_y[:y_input.shape[0],:y_input.shape[1]] = y_input\n",
        "\n",
        "  f_x = f_x.reshape((f_x.shape[0],f_x.shape[1],1))\n",
        "  f_y = f_y.reshape((f_y.shape[0],f_y.shape[1],1))\n",
        "\n",
        "  return f_x , f_y"
      ],
      "metadata": {
        "id": "1KmitK40CURZ"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "n , m , z = 20 , 64 , 1"
      ],
      "metadata": {
        "id": "4M0m_C3403DU"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "def data_pipeline(X,Y,X_OUT,Y_OUT,batch_size) :\n",
        "  x = list()\n",
        "  y = list()\n",
        "  x_out = list()\n",
        "  y_out = list()\n",
        "  t = 0\n",
        "  while 1:\n",
        "    for i in range(len(X)):\n",
        "      t+=1\n",
        "      x.append(X[i])\n",
        "      y.append(Y[i])\n",
        "      x_out.append(X_OUT[i])\n",
        "      y_out.append(Y_OUT[i])\n",
        "      if t == batch_size :\n",
        "        x = np.array(x)\n",
        "        y = np.array(y)\n",
        "        x_out = np.array(x_out)\n",
        "        y_out = np.array(y_out)\n",
        "        yield [x,y] ,[x_out,y_out]\n",
        "        x = list()\n",
        "        y = list()\n",
        "        x_out = list()\n",
        "        y_out = list()\n",
        "        t = 0"
      ],
      "metadata": {
        "id": "5Fw1rVvkLezm"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "x_input = Input(shape = (n,m+2))\n",
        "x_lstm = LSTM(256)(x_input)\n",
        "x_output = Dense(n)(x_lstm)\n",
        "\n",
        "y_input = Input(shape = (n,m+2))\n",
        "y_lstm = LSTM(256)(y_input)\n",
        "y_output = Dense(n)(y_lstm)\n",
        "\n",
        "model = Model(inputs = [x_input , y_input] , outputs = [x_output,y_output])\n",
        "model.compile(loss = \"mse\" , optimizer = \"adam\")\n",
        "\n",
        "model.summary()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "As8lmM94Ll5g",
        "outputId": "3c685856-41eb-4541-8ebb-c2e642dc1467"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Model: \"model_3\"\n",
            "__________________________________________________________________________________________________\n",
            " Layer (type)                Output Shape                 Param #   Connected to                  \n",
            "==================================================================================================\n",
            " input_7 (InputLayer)        [(None, 20, 66)]             0         []                            \n",
            "                                                                                                  \n",
            " input_8 (InputLayer)        [(None, 20, 66)]             0         []                            \n",
            "                                                                                                  \n",
            " lstm_6 (LSTM)               (None, 256)                  330752    ['input_7[0][0]']             \n",
            "                                                                                                  \n",
            " lstm_7 (LSTM)               (None, 256)                  330752    ['input_8[0][0]']             \n",
            "                                                                                                  \n",
            " dense_6 (Dense)             (None, 20)                   5140      ['lstm_6[0][0]']              \n",
            "                                                                                                  \n",
            " dense_7 (Dense)             (None, 20)                   5140      ['lstm_7[0][0]']              \n",
            "                                                                                                  \n",
            "==================================================================================================\n",
            "Total params: 671784 (2.56 MB)\n",
            "Trainable params: 671784 (2.56 MB)\n",
            "Non-trainable params: 0 (0.00 Byte)\n",
            "__________________________________________________________________________________________________\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "plot_model(model,show_shapes = True)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 312
        },
        "id": "IonCvp0cLpQW",
        "outputId": "2dbd6c74-89ef-4a6d-ecf0-69f2ebf4e62d"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "image/png": "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cTpqTOVvOhljjDHGmOA46WSMMcYYY4LjpJMxxhhjjAmOk07GGGOMMSY4s/6QaOPGjdi/f785m2xXeHxad/78eQBAaGiohXvC/l97dxoU1Zm+Dfw6QNMLdAOKCwooi0vcY9RBon/NWDGjjguKShLNmFRSmMQQozFEjYziHhy1NJqUiXFKzSi4lBojZmKMTjkuMaVGhHGNO8EtyK5s9/vBl05aQGjo7kPD9aviA2d5zt1PP32fu7vPeVot1v60Xn139OhRvh4qwXxRtbLXE/uIHEX5/7PR2x0HNVUlJSUFQD35fVmyK745ezSH35EjR9QOg+qwW7du4cyZMxgwYIDaoVAdN2XKFPTu3dvux3FY0UlUlTFjxgAAkpKSVI6EiMj5JSUlYezYseBpnuoKXtNJRERERHbHopOIiIiI7I5FJxERERHZHYtOIiIiIrI7Fp1EREREZHcsOomIiIjI7lh0EhEREZHdsegkIiIiIrtj0UlEREREdseik4iIiIjsjkUnEREREdkdi04iIiIisjsWnURERERkdyw6iYiIiMjuWHQSERERkd2x6CQiIiIiu2PRSURERER2x6KTiIiIiOyORScRERER2R2LTiIiIiKyOxadRERERGR3LDqJiIiIyO5YdBIRERGR3bHoJCIiIiK7Y9FJRERERHbHopOIiIiI7I5FJxERERHZHYtOIiIiIrI7Fp1EREREZHcsOomIiIjI7lh0EhEREZHdsegkIiIiIrtj0UlEREREdqeIiKgdBDU869evx9KlS1FSUmJedvfuXQCAr6+veZmrqyumTJmCV155xeExEhE5i/T0dPz1r39FUVGReVl+fj7u3buHgIAAi22ffvpprF+/3tEhEsFN7QCoYQoLC8PPP/9c4bqMjIxy2xIRUeVatGiBwsJCpKamlluXlZVl8X9UVJSjwiKywK/XSRVt27ZF165doShKpdsoioKuXbuibdu2DoyMiMg5vfLKK3Bze/JnSYqi4KWXXnJQRESWWHSSal555RW4urpWut7NzQ1/+9vfHBgREZHzevHFFy0uWXqcoih45plnEBQU5MCoiH7HopNUExUVhdLS0krXFxcXY8yYMQ6MiIjIeQUEBCAsLAwuLhWf2l1dXXl9PKmKRSeppkWLFggPD68wQbq4uODZZ59Fy5YtVYiMiMg5jR8/vtLLlkpLS/lGnlTFopNUNX78+AqXK4rCd+RERFYaPXp0hctdXV3Rv39/NGvWzMEREf2ORSepavTo0RVe16koCkaOHKlCREREzsvX1xcDBgyoMK9W9iafyFFYdJKqfHx88Pzzz1skSFdXV7zwwgto3LixipERETmncePG4fEpuF1cXBAREaFSRESPsOgk1Y0bN87ihiIRwbhx41SMiIjIeY0YMQIajcb8v5ubG4YMGQIvLy8VoyJi0Ul1wPDhw6HVas3/u7u7Y+jQoSpGRETkvIxGI4YOHWouPEtKSvhGnuoEFp2kOoPBgIiICGg0Gmg0GkRERMDDw0PtsIiInNbLL7+M4uJiAIBer8fgwYNVjoiIRSfVES+99BKKiopQVFTEX8sgIqqlQYMGmd+8R0ZGQq/XqxwRkYq/vX7jxg0cPnxYrcNTHVNSUgKDwQARQXZ2NpKSktQOieqI8PBw+Pv7qx2GU+Drhv6oZ8+e+OGHHxAQEMCxQWYBAQHo3bu3KsdW5PFb3BwkKSkJY8eOVePQROREEhMTOaF1NVU2KTgRUZnIyEhs2bJFlWOr9klnGZVq3npDUZR6c1I+ePAgFEXB//3f/9m03bLJktV6kVHNsYiyXn3JB2qpT/mitLQUixcvxvTp023abtmHRjx/O5/KfjzAUVQvOonK9O3bV+0QiIjqDRcXF0ybNk3tMIjMWHRSnVHRb7ATEVHNubnxNE91B8/yRERERGR3LDqJiIiIyO5YdBIRERGR3bHoJCIiIiK7c+qi8/XXX4fRaISiKDh16pTa4VilqKgICxYsQGhoKNzd3eHt7Y1OnTrhypUrDo9lz5498PLywtdff+3wYzuDffv2Yfr06di2bRuCg4OhKAoURcH48ePLbTtw4EAYjUa4urqiY8eOOHHihAoRP1l8fDw6dOgAk8kErVaL0NBQfPDBB8jNzTVvM2/ePPPj/ONfp06dLNp60jjetWsXFi9ejJKSEkc/RKohZ82p/fv3r3C8KooCT09Ph8fDnPpkzKkNN6c6ddH5xRdf4PPPP1c7jBoZO3Ys1q9fj6+++gr5+fn43//+h5CQEItB6iica61yf//737FixQrMmDEDo0aNwi+//IKQkBA0btwYGzduxDfffGOx/b///W9s2bIFQ4cORWpqKrp3765S5JXbv38/Jk2ahCtXruDu3btYsGABli9fXqP52540jocNGwadTocBAwbg/v37dngkZGvOnFMr06dPH4cfkzm1csypT1bfc6pTF53OavPmzdixYwe2bNmCP/3pT3Bzc4Ofnx927txZ7l2PIwwZMgRZWVkYOnSow48NAAUFBQgPD1fl2E+yaNEibN68GUlJSTAajRbrVqxYARcXF0RHRyMrK0ulCGvG09MT0dHRaNSoEYxGI8aMGYOIiAjs3bsX169fN2+3YcMGiIjF35kzZ8zrqzOO3333XXTt2hWDBw9GcXGxwx8rNQw6nQ7Z2dnlxmt0dDQ++OADh8fDnFox5lTmVKcvOp3xF0s+/fRTdO/eHZ07d1Y7lDph7dq1uH37ttphWLh48SJmzZqFOXPmQKfTlVsfHh6OyZMn4+bNm3j//fdViLDmdu/eDVdXV4tlvr6+AID8/Pxqt1PdcTx79mycOnUKy5cvtz5YcjhnzKl79+4tV8Rcv34dZ86cwZ///GeVolIPc6pjMadWn1MVnSKChIQEtGvXDlqtFl5eXuV+baGkpARxcXEIDAyEXq9Hly5dkJiYCABYvXo1PDw8YDAYsHPnTgwaNAgmkwn+/v7YtGmTuY2DBw+iV69eMBgMMJlM6Ny5M7Kzs6tsvzoKCwtx9OhRdOvWzQY9UnuHDh1CYGAgFEXBJ598AqB6/bRixQrodDo0bdoUEydOhJ+fH3Q6HcLDw3Hs2DEAQExMDNzd3dG8eXPz8d5++214eHhAURTcvXsXkydPxtSpU3Hp0iUoioLQ0FAAj04iJpMJ8+fPd3CPwPz4RATDhg2rdJt58+ahbdu2+OKLL7Bv375KtxMRLF26FE899RS0Wi18fHwwYsQInD17FkD1x2Vtx96T3Lx5E3q9HkFBQdXa3ppx7OPjg379+mH58uX82rGOqQ85tTKLFi3Cu+++W+t2rMWcWjHm1CdrMDlVVJKYmCjWHn7mzJmiKIr84x//kMzMTMnPz5dVq1YJADl58qSIiLz//vui1Wpl69atkpmZKTNmzBAXFxc5fvy4uQ0A8v3330tWVpbcvn1b+vbtKx4eHlJYWCi5ubliMplk8eLFUlBQIBkZGTJy5Ei5c+dOtdqvyuXLlwWAdOvWTfr37y/NmzcXrVYr7du3l08++URKS0ut6hMAkpiYaNU+j7t+/boAkJUrV5qXVdVPIiLR0dHi4eEhaWlp8uDBA0lNTZWePXuK0WiUa9euiYjIyy+/LM2aNbM4XkJCggAw9+moUaMkJCTEYpvdu3eL0WiU+Pj4Wj02EZHIyEiJjIy0ap/g4GDp0KFDhetCQkLk8uXLIiJy+PBhcXFxkdatW0tubq6IiCQnJ8vw4cPN28fFxYm7u7ts2LBB7t+/L6dPn5bu3buLr6+vZGRkiEj1+ru2Y68yeXl5YjQaJSYmxrxs7ty54u/vL97e3qLRaKR169YyfPhw+fHHH0XE+nE8ffp0i9dpddlifDck1vZXfcipFblx44Z06NBBSkpKrN63JvnicfU9p9bk/M2cWjdyqi3Gd204TdGZn58vBoNBnn/+eYvlmzZtMnd8QUGBGAwGiYqKsthPq9XKW2+9JSK/D8SCggLzNmVJ9uLFi3LmzBkBILt37y4XQ3Xar0pKSooAkOeff17++9//yr179+T+/fvy4YcfCgDZuHFjtftExP5FZ2X9JPIoQXp5eVm0dfz4cQEgc+bMEZGaJ0hbsvZFlpubK4qiyNChQytc/8cEKSIydepUASCTJk0SEcsEmZ+fL56enhZjRkTkxx9/FADmE0BV/W2LsVeZmTNnStu2bSU7O9u87Nq1a3LixAnJycmRhw8fypEjR+Tpp58WvV4vZ86csXocf/nllwJA1q9fb1VsLDqtY01/1ZecWpFJkybJp59+WqN97V101oecau35mzm17uRUtYtOp/l6/eLFi8jPz8eAAQMq3ebcuXPIz8+3uBlHr9ejefPm5o/dK+Lu7g7g0VQFwcHBaNq0KcaNG4fZs2dbTGFU0/b/SKvVAgA6duyI8PBwNGrUCF5eXpgzZw68vLywZs2aarWjhj/2U2V69OgBg8FQ7f6oi27fvg0RgcFgqNb28+bNQ7t27bBq1SocOnTIYl1qaipyc3PRo0cPi+U9e/aEu7u7+Wuzivyxv20x9iqyfft2JCUl4dtvv7W4Ji4gIABPP/00PD094e7ujrCwMKxbtw4FBQVYtWqV1eO4rC9v3bpV41jJtupLTn1ceno6du3ahQkTJtRof0diTq0Yc2r9zalOU3TeuHEDANCkSZNKt8nLywMAfPTRRxbzYF29erXaF/Pq9Xrs378fffr0wfz58xEcHIyoqCgUFBTYpH0/Pz8AwN27dy2Wu7u7o1WrVrh06VK12qnLtFot7ty5o3YYNfbgwQMAv79BqIpOp8O6deugKApee+01FBQUmNeVTWtR0VyB3t7eyMnJqdYxbDH2Hrd582YsWrQIBw4cQOvWravcvnPnznB1dcX58+etHsd6vR7A731L6qsvOfVxixcvxhtvvFHhzSrOijmVObW+5FSnKTrLEsjDhw8r3aYseS5btqzctARHjhyp9rE6duyIr7/+Gunp6YiNjUViYiKWLFlik/Y9PT3Rpk0bpKWllVtXXFwMLy+vasdZFxUVFeH+/fvw9/dXO5QaK3sxWzMBb+/evTFlyhRcuHABc+fONS/39vYGgAoToTX9ZKuxXWblypXYuHEj9u/fjxYtWlRrn9LSUpSWlkKr1Vo9jgsLCwH83rekvvqSU/8oIyMD//rXv/DWW29ZvW9dxZzKnFqfcqrTFJ2dOnWCi4sLDh48WOk2AQEB0Ol0tfoljfT0dPOT3qRJEyxcuBDdu3dHWlqaTdoHHk3+evLkSfzyyy/mZfn5+bh69arTT6N04MABiAjCwsIAAG5ubk/86qguatq0KRRFsXquuLlz56J9+/Y4efKkeVmnTp3g6emJn376yWLbY8eOobCwEM8880y12rbV2BMRxMbGIiUlBTt27Kj011peeOGFcsuOHz8OEUHv3r0BWDeOy/qyWbNmtYqfbKc+5dQyixcvxrhx49CoUSObtFcXMKcyp9annOo0RWeTJk0QGRmJrVu3Yu3atcjOzsbp06ctrnPQ6XR49dVXsWnTJqxevRrZ2dkoKSnBjRs38Ouvv1brOOnp6Zg4cSLOnj2LwsJCnDx5ElevXkVYWJhN2geAKVOmoFWrVpgwYQKuXbuGe/fuITY2FgUFBfjwww+t7hs1lZaWIjMzE8XFxTh9+jQmT56MwMBA8/VUoaGh+O2337Bjxw4UFRXhzp07uHr1qkUbjRo1Qnp6Oq5cuYKcnBwUFRUhOTlZtek9DAYDgoODzV8/VlfZV0J/nK9Np9Nh6tSp2L59OzZu3Ijs7GykpKTgzTffhJ+fH6Kjo6vddlVjLyoqCs2aNXviz8SlpaXh448/xueffw6NRlPuJ9mWLFkC4NF0H5s3b8b9+/dRVFSEI0eO4PXXX0dgYCDefPNNANaN47K+dPY3VfVJfcqpwKNr27788ku89957Vu1X1zCn/o45tR7mVPvfq1Sxmky5kJOTI2+88YY0btxYPD09pU+fPhIXFycAxN/fX37++Wd5+PChxMbGSmBgoLi5uUmTJk1k1KhRkpqaKqtWrRKDwSAApE2bNnLp0iVZs2aNmEwmASCtWrWS7777TsLDw8XHx0dcXV2lRYsWMnPmTCkuLhYReWL71rh+/bq8+OKL4uPjI1qtVnr16iXJyclWtSFS+7t7V65cKc2bNxcAYjAYZNiwYdXqp/Pnz0t0dLRoNBpp2bKluLm5iclkkhEjRsilS5fM7d+7d0+ee+450el0EhQUJO+8845MmzZNAEhoaKj5jr5WrVqJXq+XPn36SEZGhuzZs0eMRqPMmzevxo+tTE3u1ouJiRGNRiP5+fnmZdu3b5eQkBABIL6+vuY7Kx83bdo0i+k9SktLJSEhQdq0aSMajUZ8fHwkIiJCzp07JyJS7f6uauxFREQIAImLi6v0cZXdIVnZX0JCgog8uns0JCREPDw8xM3NTfz9/eWNN96Q9PR0i/aqO46HDBkiLVu2VGVKsIbE2v6qTzl1ypQpMm7cOKv2qUht7+5tCDm1Judv5tS6kVPVvnvdqYpOKk/Nk3J0dLQ0atRIlWNboyYvsgsXLoibm5ts2LDBTlHZXklJifTt21fWrl2rdigW7t69KzqdTpYsWWL1viw6rcP+qj01T8rOklNrcv5mTrWd2uRUtYtOp/l6neomay4MdyahoaGIj49HfHw8cnNz1Q6nSiUlJdixYwdycnIQFRWldjgWZs+ejW7duiEmJkbtUIjqPObUuoE51T5YdNrI2bNny13LUdFfXRu8VLnp06dj9OjRiIqKsvoCeEc7cOAAtm3bhuTk5GrPhecIS5cuxalTp7Bnzx5oNBq1wyEnwpxa/zCn1p6z51QWnTbSvn37ctMuVPS3efNmtUO1iRkzZmDdunXIyspCUFAQtm7dqnZIdjF//nzExMRg4cKFaofyRAMGDMBXX31l8ZvMatu5cycePnyIAwcOwMfHR+1wyMkwpzKnqok51T7c1A6AnNOCBQuwYMECtcNwiIEDB2LgwIFqh+F0hg8fjuHDh6sdBpFTYE6lqtSHnMpPOomIiIjI7lh0EhEREZHdsegkIiIiIrtj0UlEREREdqf6jUSjR49WOwSnt2zZMmzZskXtMOqso0ePAuBYo4aB+aB2mC+qVvYTjOwj53P06FGEhYWpdnx+0klEREREdqf6J518R147iqLgvffew5gxY9QOpc4qezfOseZ8FEVROwSnw3xQO8wXVUtKSsLYsWPZR05I7U+n+UknEREREdkdi04iIiIisjsWnURERERkdyw6iYiIiMjuWHQSERERkd3Vi6Jz27ZtCA4OhqIoFn/u7u5o2rQp+vfvj4SEBGRmZqodKtUD+/btw/Tp08uNu/Hjx5fbduDAgTAajXB1dUXHjh1x4sQJFSJ+svj4eHTo0AEmkwlarRahoaH44IMPkJuba7HdoUOH8Oyzz8JgMMDPzw+xsbF4+PAhAGDXrl1YvHgxSkpK1HgIZAfMq+RIzKsNJK+KShITE8XWhw8JCREvLy8RESktLZXMzEz54YcfZMKECaIoivj5+cnx48dteky1AZDExES1w6jTIiMjJTIy0iZtxcXFydChQyU7O9u8LCQkRBo3biwAZPfu3eX2SU5OluHDh9vk+PbQr18/WbVqldy7d0+ys7MlMTFRNBqN/OUvfzFvc+bMGdHr9TJr1izJzc2Vw4cPi6+vr7z66qvmbZYvXy79+vWTzMxMm8XG8W0de/RXQ8urtswX9ZWtz9/Mq47Lq2qP73rxSWdFFEWBt7c3+vfvj3Xr1iEpKQm3bt3CkCFDkJWVpXZ4Tq+goADh4eFO13ZtLFq0CJs3b0ZSUhKMRqPFuhUrVsDFxQXR0dFON748PT0RHR2NRo0awWg0YsyYMYiIiMDevXtx/fp1AMDcuXPRvHlzzJkzBx4eHujduzdiY2Pxz3/+E2fPngUAvPvuu+jatSsGDx6M4uJiNR8S2Qnzqn0xrzKv1ve8Wm+LzsdFRkZiwoQJuH37Nj777DO1w3F6a9euxe3bt52u7Zq6ePEiZs2ahTlz5kCn05VbHx4ejsmTJ+PmzZt4//33VYiw5nbv3g1XV1eLZb6+vgCA/Px8FBcX45tvvkG/fv0sJmsfNGgQRAQ7d+40L5s9ezZOnTqF5cuXOyZ4UhXzqm0xr1piXn2kPuXVBlN0AsCECRMAAMnJyQCAkpISxMXFITAwEHq9Hl26dEFiYiIAYPXq1fDw8IDBYMDOnTsxaNAgmEwm+Pv7Y9OmTeY2Dx48iF69esFgMMBkMqFz587Izs6usn21iAiWLl2Kp556ClqtFj4+PhgxYoT5XVVMTAzc3d3RvHlz8z5vv/02PDw8oCgK7t69i8mTJ2Pq1Km4dOkSFEVBaGgoVqxYAZ1Oh6ZNm2LixInw8/ODTqdDeHg4jh07Vqu2AWDv3r0wmUyYP3++A3vrdytWrICIYNiwYZVuM2/ePLRt2xZffPEF9u3bV+l2VT0H1R179hxfN2/ehF6vR1BQEH755Rfk5uYiMDDQYpuQkBAAwOnTp83LfHx80K9fPyxfvhwiYpNYqG5jXmVerSnm1QaYV9X6Xt/e13RWJDs7WwBIQECAiIi8//77otVqZevWrZKZmSkzZswQFxcX8/VJM2fOFADy/fffS1ZWlty+fVv69u0rHh4eUlhYKLm5uWIymWTx4sVSUFAgGRkZMnLkSLlz50612rcFWHkNV1xcnLi7u8uGDRvk/v37cvr0aenevbv4+vpKRkaGiIi8/PLL0qxZM4v9EhISBID5sY0aNUpCQkIstomOjhYPDw9JS0uTBw8eSGpqqvTs2VOMRqNcu3atVm3v3r1bjEajxMfHV/uxlrHFNSzBwcHSoUOHCteFhITI5cuXRUTk8OHD4uLiIq1bt5bc3FwRKX/tUXWeg6rGnoj9xldeXp4YjUaJiYlSdvJ1AAAI3klEQVQREZGDBw8KAElISCi3rV6vlwEDBlgsmz59ugCQkydP1ioOEV7TaS179FdDy6s1yRcNLa/a6vzNvOr4vMprOh3IaDRCURTk5OTgwYMHWL16NSIiIjBq1Ch4e3vjo48+gkajwbp16yz2Cw8Ph8lkQpMmTRAVFYW8vDxcu3YNV65cQXZ2Njp27AidTodmzZph27Zt8PX1tap9RykoKMDSpUsxcuRIjBs3Dl5eXujcuTM+++wz3L17F2vWrKn1Mdzc3MzvNDt06IDVq1cjJyen1o95yJAhyM7OxqxZs2odo7Xy8vJw+fJl8zvQJ+nduzfee+89XLlyBR9++GG59dY+B5WNPXuOrwULFsDPzw/z5s0DAPOdlI9/VQQAGo0GBQUFFsvatGkDAEhJSalVHOQcmFeZV2uCebVh5tUGVXTm5eVBRGAymXDu3Dnk5+ejU6dO5vV6vR7Nmzc3fxxfEXd3dwBAUVERgoOD0bRpU4wbNw6zZ8/GlStXzNvVtH17Sk1NRW5uLnr06GGxvGfPnnB3dzd/XWNLPXr0gMFgUO0x28Lt27chIjAYDNXaft68eWjXrh1WrVqFQ4cOWayrzXPwx7Fnr/G1fft2JCUl4dtvvzVf1F92rVVFF7EXFhZCr9dbLCvrp1u3btU4DnIezKvMqzXBvNow82qDKjrPnz8PAGjfvj3y8vIAAB999JHFHHRXr15Ffn5+tdrT6/XYv38/+vTpg/nz5yM4OBhRUVEoKCiwSfu2dv/+fQCP7qp7nLe3N3JycuxyXK1Wizt37tilbUd48OABgEePozp0Oh3WrVsHRVHw2muvWbxjtdVzYI/xtXnzZixatAgHDhxA69atzcvLrhUru6auTH5+Ph48eAA/Pz+L5WXJsqzfqH5jXmVerQnm1YaZVxtU0bl3714Aj+4Oa9KkCQBg2bJlEBGLvyNHjlS7zY4dO+Lrr79Geno6YmNjkZiYiCVLltisfVvy9vYGgApfgPfv34e/v7/Nj1lUVGS3th2l7MVuzQS9vXv3xpQpU3DhwgXMnTvXvNxWz4Gtx9fKlSuxceNG7N+/Hy1atLBYFxQUBKPRiKtXr1osv3jxIgCgS5cuFssLCwsBoNw7daqfmFeZV2uCebVh5tUGU3RmZGRg2bJl8Pf3x2uvvYaAgADodDqcOnWqxm2mp6cjLS0NwKPBunDhQnTv3h1paWk2ad/WOnXqBE9PT/z0008Wy48dO4bCwkI888wzAB5dP1RUVGSTYx44cAAigrCwMJu37ShNmzaFoihWzxM3d+5ctG/fHidPnjQvq+5zUBVbjS8RQWxsLFJSUrBjx44KPylwc3PD4MGD8Z///AelpaXm5cnJyVAUpdydp2X91KxZs1rFRnUf8yrzak0xrzbMvFrvik4RQW5uLkpLSyEiuHPnDhITE/Hss8/C1dUVO3bsgMlkgk6nw6uvvopNmzZh9erVyM7ORklJCW7cuIFff/21WsdKT0/HxIkTcfbsWRQWFuLkyZO4evUqwsLCbNK+rel0OkydOhXbt2/Hxo0bkZ2djZSUFLz55pvw8/NDdHQ0ACA0NBS//fYbduzYgaKiIty5c6fcu7FGjRohPT0dV65cQU5OjjnhlZaWIjMzE8XFxTh9+jQmT56MwMBA87QqNW07OTlZtak9DAYDgoODcePGDav2K/s66I8Xilf3OahO21WNr6ioKDRr1uyJPxGXlpaGjz/+GJ9//jk0Gk25nzxcsmQJAGDWrFm4desW/v73vyMvLw9HjhxBQkICJkyYgHbt2lm0WdZPnTt3tqq/qO5iXq0c82rNMK820Lxq35vjK2fLKZN27dolXbp0EYPBIO7u7uLi4iIARFEU8fb2ll69ekl8fLzcu3fPYr+HDx9KbGysBAYGipubmzRp0kRGjRolqampsmrVKjEYDAJA2rRpI5cuXZI1a9aIyWQSANKqVSv57rvvJDw8XHx8fMTV1VVatGghM2fOlOLi4irbtxVYOUVKaWmpJCQkSJs2bUSj0YiPj49ERETIuXPnzNvcu3dPnnvuOdHpdBIUFCTvvPOOTJs2TQBIaGioXLt2TU6cOCGtWrUSvV4vffr0kYyMDImOjhaNRiMtW7YUNzc3MZlMMmLECLl06VKt296zZ48YjUaZN2+e1X1kiykiYmJiRKPRSH5+vnnZ9u3bJSQkRACIr6+vTJo0qcJ9p02bZjG1R1XPQXXG3vnz56scXxEREQJA4uLiKn1cKSkpAqDSvz9O53Hw4EHp1auXaLVa8fPzk2nTpsmDBw/KtTlkyBBp2bKllJaWWtfJFbB2fDd0tuyvhppXa5IvGlpetdX5m3nV8XlV7SmT6kXR2ZDVpZNydHS0NGrUSO0wyrHFi+zChQvi5uYmGzZssFFU9ldSUiJ9+/aVtWvXOuyYd+/eFZ1OJ0uWLLFJe3VpfDsD9lftqX1SflxdzKu2On8zr1aPLfOq2uO73n29Tuqy5qJwZxIaGor4+HjEx8cjNzdX7XCqVFJSgh07diAnJwdRUVEOO+7s2bPRrVs3xMTEOOyYRPUd82rdwLxaeyw6iapp+vTpGD16NKKioqy++N3RDhw4gG3btiE5Obna8+DV1tKlS3Hq1Cns2bMHGo3GIcckIufGvPpk9S2vsugkm5gxYwbWrVuHrKwsBAUFYevWrWqHZBfz589HTEwMFi5cqHYoTzRgwAB89dVXFr/HbE87d+7Ew4cPceDAAfj4+DjkmET1HfNq3cK8WntuagdA9cOCBQuwYMECtcNwiIEDB2LgwIFqh1GnDB8+HMOHD1c7DKJ6hXm1YauPeZWfdBIRERGR3bHoJCIiIiK7Y9FJRERERHbHopOIiIiI7I5FJxERERHZnep3ryuKonYITm/s2LEYO3as2mHUeRxr1BAwH9gG80XV2EfOKTIyUrVjq1Z0hoeHIzExUa3DE5GTCA8PVzsEp8GcSkRVCQgIUO3YioiIakcnIiIiogaB13QSERERkd2x6CQiIiIiu2PRSURERER25wZgi9pBEBEREVH99v8ABIguOSV4sGwAAAAASUVORK5CYII=\n",
            "text/plain": [
              "<IPython.core.display.Image object>"
            ]
          },
          "metadata": {},
          "execution_count": 80
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "def convert_data(list_dir) :\n",
        "  X = list()\n",
        "  Y = list()\n",
        "  X_OUT = list()\n",
        "  Y_OUT = list()\n",
        "\n",
        "  for i in list_dir:\n",
        "    f_x , f_y = excel_to_data(f\"/content/drive/MyDrive/miniproj_all_cordi/xy{i}.xlsx\")\n",
        "\n",
        "    for k in range(1):\n",
        "      for j in range(1,46) :\n",
        "        x_arr = np.zeros((n,m+2))\n",
        "        y_arr = np.zeros((n,m+2))\n",
        "        x_act = np.array(n)\n",
        "        y_act = np.array(n)\n",
        "        x_arr[:,0] = -1\n",
        "        x_arr[:,m+1] = 2\n",
        "        y_arr[:,0] = -1\n",
        "        y_arr[:,m+1] = 2\n",
        "        x_arr[:,1:j+1] = f_x[:,:j,k]\n",
        "        y_arr[:,1:j+1] = f_y[:,:j,k]\n",
        "        x_act = f_x[:,j,k]\n",
        "        y_act = f_y[:,j,k]\n",
        "        X.append(x_arr)\n",
        "        Y.append(y_arr)\n",
        "        X_OUT.append(x_act)\n",
        "        Y_OUT.append(y_act)\n",
        "\n",
        "  return X , Y , X_OUT , Y_OUT"
      ],
      "metadata": {
        "id": "CtxaoZUCYY3l"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "list_dir = [5,6,7,9,10]\n",
        "X , Y , X_OUT , Y_OUT = convert_data(list_dir)"
      ],
      "metadata": {
        "id": "wEnyNRWRZQe8"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "len(X_OUT)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "fKDKBzNLZiE4",
        "outputId": "db3ca3a9-4edb-40b1-a0d1-2ec823e59604"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "225"
            ]
          },
          "metadata": {},
          "execution_count": 83
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "def train(X,Y,X_OUT,Y_OUT,model) :\n",
        "\n",
        "    epochs = 20\n",
        "    batch_size = 32\n",
        "    steps = len(X)//batch_size\n",
        "\n",
        "    for j in range(epochs) :\n",
        "      data = data_pipeline(X,Y,X_OUT,Y_OUT,batch_size)\n",
        "      model.fit(data,epochs = 1,steps_per_epoch = steps,verbose = 1)\n"
      ],
      "metadata": {
        "id": "4soQOpIQLEl9"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "train(X,Y,X_OUT,Y_OUT,model)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "ca8zcIj8QeBh",
        "outputId": "73b6a392-2314-4882-e1e9-44cfd54e75fb"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "7/7 [==============================] - 4s 96ms/step - loss: 0.2468 - dense_6_loss: 0.1059 - dense_7_loss: 0.1408\n",
            "7/7 [==============================] - 1s 95ms/step - loss: 0.1596 - dense_6_loss: 0.0794 - dense_7_loss: 0.0802\n",
            "7/7 [==============================] - 1s 95ms/step - loss: 0.1143 - dense_6_loss: 0.0511 - dense_7_loss: 0.0631\n",
            "7/7 [==============================] - 1s 119ms/step - loss: 0.0941 - dense_6_loss: 0.0434 - dense_7_loss: 0.0507\n",
            "7/7 [==============================] - 1s 147ms/step - loss: 0.0842 - dense_6_loss: 0.0405 - dense_7_loss: 0.0437\n",
            "7/7 [==============================] - 1s 98ms/step - loss: 0.0735 - dense_6_loss: 0.0346 - dense_7_loss: 0.0389\n",
            "7/7 [==============================] - 1s 93ms/step - loss: 0.0651 - dense_6_loss: 0.0319 - dense_7_loss: 0.0331\n",
            "7/7 [==============================] - 1s 94ms/step - loss: 0.0563 - dense_6_loss: 0.0299 - dense_7_loss: 0.0264\n",
            "7/7 [==============================] - 1s 99ms/step - loss: 0.0524 - dense_6_loss: 0.0299 - dense_7_loss: 0.0224\n",
            "7/7 [==============================] - 1s 101ms/step - loss: 0.0484 - dense_6_loss: 0.0290 - dense_7_loss: 0.0194\n",
            "7/7 [==============================] - 1s 93ms/step - loss: 0.0493 - dense_6_loss: 0.0287 - dense_7_loss: 0.0206\n",
            "7/7 [==============================] - 1s 94ms/step - loss: 0.0426 - dense_6_loss: 0.0244 - dense_7_loss: 0.0182\n",
            "7/7 [==============================] - 1s 101ms/step - loss: 0.0424 - dense_6_loss: 0.0234 - dense_7_loss: 0.0190\n",
            "7/7 [==============================] - 1s 96ms/step - loss: 0.0358 - dense_6_loss: 0.0176 - dense_7_loss: 0.0183\n",
            "7/7 [==============================] - 1s 98ms/step - loss: 0.0301 - dense_6_loss: 0.0156 - dense_7_loss: 0.0145\n",
            "7/7 [==============================] - 1s 124ms/step - loss: 0.0271 - dense_6_loss: 0.0140 - dense_7_loss: 0.0130\n",
            "7/7 [==============================] - 1s 95ms/step - loss: 0.0246 - dense_6_loss: 0.0134 - dense_7_loss: 0.0113\n",
            "7/7 [==============================] - 1s 97ms/step - loss: 0.0244 - dense_6_loss: 0.0124 - dense_7_loss: 0.0120\n",
            "7/7 [==============================] - 1s 97ms/step - loss: 0.0220 - dense_6_loss: 0.0118 - dense_7_loss: 0.0102\n",
            "7/7 [==============================] - 1s 98ms/step - loss: 0.0242 - dense_6_loss: 0.0121 - dense_7_loss: 0.0121\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "def predict(model , x_start , y_start) :\n",
        "  x_input , y_input = x_start , y_start\n",
        "  f_pre_x = list()\n",
        "  f_pre_y = list()\n",
        "  for j in range(46,51):\n",
        "    x_pre , y_pre = model.predict( [x_input , y_input] , verbose = 0)\n",
        "    f_pre_x.append(x_pre)\n",
        "    f_pre_y.append(y_pre)\n",
        "    x_input[:,:,j] = x_pre\n",
        "    y_input[:,:,j] = y_pre\n",
        "\n",
        "  return f_pre_x , f_pre_y"
      ],
      "metadata": {
        "id": "m1sd8MuLUXsc"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# x_start = np.zeros((1,n,m+2))\n",
        "# y_start = np.zeros((1,n,m+2))\n",
        "\n",
        "# x_start[:,:,0] = -1\n",
        "# x_start[:,:,m+1] = 2\n",
        "# x_start[:,:,1] = np.random.uniform(low = 1.0 , high = 2.0, size = n)\n",
        "\n",
        "# y_start[:,:,0] = -1\n",
        "# y_start[:,:,m+1] = 3\n",
        "# y_start[:,:,1] = np.random.uniform(low = 1.0, high = 2.0 ,size = n)\n",
        "\n",
        "# x_final , y_final =  predict(model,x_start , y_start)\n",
        "\n",
        "# x_final = x_final.reshape((x_final.shape[1],x_final.shape[2]))\n",
        "# y_final = y_final.reshape((y_final.shape[1],y_final.shape[2]))\n"
      ],
      "metadata": {
        "id": "AwMENFaeaVlA"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# x_final = pd.DataFrame(x_final)\n",
        "# y_final = pd.DataFrame(y_final)"
      ],
      "metadata": {
        "id": "gok9Q-dDCI-B"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# x_final.head()"
      ],
      "metadata": {
        "id": "Yk9t5ptLM6yB"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# act_x , act_y = excel_to_data(f\"/content/drive/MyDrive/miniproj_all_cordi/xy10.xlsx\")"
      ],
      "metadata": {
        "id": "NUJpKM_Kh2s3"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "# pre_x , pre_y = np.zeros((1,n,m+2)) ,np.zeros((1,n,m+2))\n",
        "# pre_x[:,:,0] = -1\n",
        "# pre_x[:,:,m+1] = 2\n",
        "\n",
        "# pre_y[:,:,0] = -1\n",
        "# pre_y[:,:,m+1] = 2\n",
        "\n",
        "# pre_x[0,:,1:46] = act_x[:,0:45,0]\n",
        "# pre_y[0,:,1:46] = act_y[:,0:45,0]\n",
        "\n",
        "# pred_x , pred_y = predict(model,pre_x,pre_y)\n",
        "\n",
        "# final_prediction = list()\n",
        "\n",
        "# for i in range(len(pred_x)) :\n",
        "#   final_prediction.append(pred_x[i])\n",
        "#   final_prediction.append(pred_y[i])\n",
        "\n",
        "# print(final_prediction)\n"
      ],
      "metadata": {
        "id": "419sEG-AiNEM"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "def final_predict(path) :\n",
        "  act_x , act_y = excel_to_data(path)\n",
        "\n",
        "  pre_x , pre_y = np.zeros((1,n,m+2)) ,np.zeros((1,n,m+2))\n",
        "  pre_x[:,:,0] = -1\n",
        "  pre_x[:,:,m+1] = 2\n",
        "\n",
        "  pre_y[:,:,0] = -1\n",
        "  pre_y[:,:,m+1] = 2\n",
        "\n",
        "  pre_x[0,:,1:46] = act_x[:,0:45,0]\n",
        "  pre_y[0,:,1:46] = act_y[:,0:45,0]\n",
        "\n",
        "  pred_x , pred_y = predict(model,pre_x,pre_y)\n",
        "\n",
        "  final_prediction = list()\n",
        "\n",
        "  for i in range(len(pred_x)) :\n",
        "    final_prediction.append(pred_x[i])\n",
        "    final_prediction.append(pred_y[i])\n",
        "\n",
        "  return final_prediction"
      ],
      "metadata": {
        "id": "avzU-nb67VrH"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "output = final_predict(f\"/content/drive/MyDrive/miniproj_all_cordi/xy10.xlsx\")\n"
      ],
      "metadata": {
        "id": "yetNJBWE77yL"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "def show_output(output) :\n",
        "  output = np.array(output)\n",
        "  final_output = np.zeros((output.shape[2],output.shape[0]))\n",
        "  for i in range(output.shape[2]):\n",
        "    final_output[i:] = output[:,0,i]\n",
        "\n",
        "  final_output = pd.DataFrame(final_output)\n",
        "  return final_output"
      ],
      "metadata": {
        "id": "G2IEyc9ym1Bz"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "show_output(output)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 676
        },
        "id": "5tBu6fhlm80X",
        "outputId": "f2ea70ad-8f65-48d7-ce4f-8426f21c0c9f"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "           0         1         2         3         4         5         6  \\\n",
              "0   0.451354  0.803318  0.445934  0.819162  0.452205  0.832382  0.456957   \n",
              "1   0.014711 -0.024442  0.011283 -0.033169  0.011136 -0.042533  0.011274   \n",
              "2   0.929141  0.280980  0.936789  0.262648  0.927870  0.242453  0.924096   \n",
              "3   0.058149  0.513097  0.065023  0.512623  0.067998  0.497268  0.071069   \n",
              "4  -0.009071  0.010864 -0.005985  0.026772  0.007754  0.051366  0.008156   \n",
              "5   0.920517  0.280614  0.925576  0.293067  0.926336  0.286017  0.918015   \n",
              "6   0.777272  0.498472  0.774252  0.492874  0.769463  0.483688  0.766085   \n",
              "7   0.004046  0.477145  0.009620  0.502113 -0.001565  0.508627  0.004634   \n",
              "8  -0.002245  0.012918 -0.006376  0.006810  0.001279  0.025096  0.003233   \n",
              "9   0.777322  0.576315  0.774689  0.581836  0.769970  0.579595  0.776971   \n",
              "10  0.509265  0.850535  0.503891  0.846201  0.505457  0.846048  0.501087   \n",
              "11  0.554535  0.602175  0.551160  0.570999  0.553664  0.570855  0.537318   \n",
              "12  0.451906  0.680028  0.453471  0.701555  0.449582  0.692263  0.442254   \n",
              "13  0.569547  0.648252  0.571161  0.650773  0.579237  0.641704  0.574946   \n",
              "14 -0.004484 -0.046578 -0.006184 -0.027306 -0.004580 -0.016151 -0.002989   \n",
              "15  0.028347  0.536930  0.027382  0.537159  0.032957  0.524090  0.038999   \n",
              "16  0.189704  0.830458  0.185066  0.845195  0.182196  0.843201  0.182746   \n",
              "17 -0.042574 -0.001307 -0.036587  0.025602 -0.036717  0.048637 -0.042817   \n",
              "18  0.038967  0.930852  0.041272  0.926384  0.039467  0.916860  0.035485   \n",
              "19  0.004137 -0.020264  0.001758  0.000139  0.003657 -0.004372  0.003317   \n",
              "\n",
              "           7         8         9  \n",
              "0   0.861451  0.451404  0.879231  \n",
              "1  -0.027484  0.012889 -0.037772  \n",
              "2   0.218736  0.911101  0.213284  \n",
              "3   0.499855  0.071905  0.499646  \n",
              "4   0.043066  0.005910  0.006525  \n",
              "5   0.293329  0.904056  0.291075  \n",
              "6   0.463574  0.755820  0.480562  \n",
              "7   0.488070  0.006254  0.513907  \n",
              "8   0.020644 -0.001935  0.035368  \n",
              "9   0.590594  0.778111  0.600925  \n",
              "10  0.851618  0.502440  0.843256  \n",
              "11  0.566608  0.531407  0.586758  \n",
              "12  0.704620  0.430238  0.717612  \n",
              "13  0.631816  0.569829  0.635715  \n",
              "14  0.004683 -0.008040 -0.011188  \n",
              "15  0.518719  0.037088  0.527366  \n",
              "16  0.841481  0.191452  0.828862  \n",
              "17  0.052739 -0.052082  0.023297  \n",
              "18  0.918129  0.032661  0.920337  \n",
              "19  0.001623  0.006790  0.009386  "
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-706b1cb1-8650-4457-ae32-b51f6fb639b9\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>0</th>\n",
              "      <th>1</th>\n",
              "      <th>2</th>\n",
              "      <th>3</th>\n",
              "      <th>4</th>\n",
              "      <th>5</th>\n",
              "      <th>6</th>\n",
              "      <th>7</th>\n",
              "      <th>8</th>\n",
              "      <th>9</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0.451354</td>\n",
              "      <td>0.803318</td>\n",
              "      <td>0.445934</td>\n",
              "      <td>0.819162</td>\n",
              "      <td>0.452205</td>\n",
              "      <td>0.832382</td>\n",
              "      <td>0.456957</td>\n",
              "      <td>0.861451</td>\n",
              "      <td>0.451404</td>\n",
              "      <td>0.879231</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>0.014711</td>\n",
              "      <td>-0.024442</td>\n",
              "      <td>0.011283</td>\n",
              "      <td>-0.033169</td>\n",
              "      <td>0.011136</td>\n",
              "      <td>-0.042533</td>\n",
              "      <td>0.011274</td>\n",
              "      <td>-0.027484</td>\n",
              "      <td>0.012889</td>\n",
              "      <td>-0.037772</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>0.929141</td>\n",
              "      <td>0.280980</td>\n",
              "      <td>0.936789</td>\n",
              "      <td>0.262648</td>\n",
              "      <td>0.927870</td>\n",
              "      <td>0.242453</td>\n",
              "      <td>0.924096</td>\n",
              "      <td>0.218736</td>\n",
              "      <td>0.911101</td>\n",
              "      <td>0.213284</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>0.058149</td>\n",
              "      <td>0.513097</td>\n",
              "      <td>0.065023</td>\n",
              "      <td>0.512623</td>\n",
              "      <td>0.067998</td>\n",
              "      <td>0.497268</td>\n",
              "      <td>0.071069</td>\n",
              "      <td>0.499855</td>\n",
              "      <td>0.071905</td>\n",
              "      <td>0.499646</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>-0.009071</td>\n",
              "      <td>0.010864</td>\n",
              "      <td>-0.005985</td>\n",
              "      <td>0.026772</td>\n",
              "      <td>0.007754</td>\n",
              "      <td>0.051366</td>\n",
              "      <td>0.008156</td>\n",
              "      <td>0.043066</td>\n",
              "      <td>0.005910</td>\n",
              "      <td>0.006525</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>5</th>\n",
              "      <td>0.920517</td>\n",
              "      <td>0.280614</td>\n",
              "      <td>0.925576</td>\n",
              "      <td>0.293067</td>\n",
              "      <td>0.926336</td>\n",
              "      <td>0.286017</td>\n",
              "      <td>0.918015</td>\n",
              "      <td>0.293329</td>\n",
              "      <td>0.904056</td>\n",
              "      <td>0.291075</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>6</th>\n",
              "      <td>0.777272</td>\n",
              "      <td>0.498472</td>\n",
              "      <td>0.774252</td>\n",
              "      <td>0.492874</td>\n",
              "      <td>0.769463</td>\n",
              "      <td>0.483688</td>\n",
              "      <td>0.766085</td>\n",
              "      <td>0.463574</td>\n",
              "      <td>0.755820</td>\n",
              "      <td>0.480562</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>7</th>\n",
              "      <td>0.004046</td>\n",
              "      <td>0.477145</td>\n",
              "      <td>0.009620</td>\n",
              "      <td>0.502113</td>\n",
              "      <td>-0.001565</td>\n",
              "      <td>0.508627</td>\n",
              "      <td>0.004634</td>\n",
              "      <td>0.488070</td>\n",
              "      <td>0.006254</td>\n",
              "      <td>0.513907</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8</th>\n",
              "      <td>-0.002245</td>\n",
              "      <td>0.012918</td>\n",
              "      <td>-0.006376</td>\n",
              "      <td>0.006810</td>\n",
              "      <td>0.001279</td>\n",
              "      <td>0.025096</td>\n",
              "      <td>0.003233</td>\n",
              "      <td>0.020644</td>\n",
              "      <td>-0.001935</td>\n",
              "      <td>0.035368</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>9</th>\n",
              "      <td>0.777322</td>\n",
              "      <td>0.576315</td>\n",
              "      <td>0.774689</td>\n",
              "      <td>0.581836</td>\n",
              "      <td>0.769970</td>\n",
              "      <td>0.579595</td>\n",
              "      <td>0.776971</td>\n",
              "      <td>0.590594</td>\n",
              "      <td>0.778111</td>\n",
              "      <td>0.600925</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10</th>\n",
              "      <td>0.509265</td>\n",
              "      <td>0.850535</td>\n",
              "      <td>0.503891</td>\n",
              "      <td>0.846201</td>\n",
              "      <td>0.505457</td>\n",
              "      <td>0.846048</td>\n",
              "      <td>0.501087</td>\n",
              "      <td>0.851618</td>\n",
              "      <td>0.502440</td>\n",
              "      <td>0.843256</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>11</th>\n",
              "      <td>0.554535</td>\n",
              "      <td>0.602175</td>\n",
              "      <td>0.551160</td>\n",
              "      <td>0.570999</td>\n",
              "      <td>0.553664</td>\n",
              "      <td>0.570855</td>\n",
              "      <td>0.537318</td>\n",
              "      <td>0.566608</td>\n",
              "      <td>0.531407</td>\n",
              "      <td>0.586758</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>12</th>\n",
              "      <td>0.451906</td>\n",
              "      <td>0.680028</td>\n",
              "      <td>0.453471</td>\n",
              "      <td>0.701555</td>\n",
              "      <td>0.449582</td>\n",
              "      <td>0.692263</td>\n",
              "      <td>0.442254</td>\n",
              "      <td>0.704620</td>\n",
              "      <td>0.430238</td>\n",
              "      <td>0.717612</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>13</th>\n",
              "      <td>0.569547</td>\n",
              "      <td>0.648252</td>\n",
              "      <td>0.571161</td>\n",
              "      <td>0.650773</td>\n",
              "      <td>0.579237</td>\n",
              "      <td>0.641704</td>\n",
              "      <td>0.574946</td>\n",
              "      <td>0.631816</td>\n",
              "      <td>0.569829</td>\n",
              "      <td>0.635715</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>14</th>\n",
              "      <td>-0.004484</td>\n",
              "      <td>-0.046578</td>\n",
              "      <td>-0.006184</td>\n",
              "      <td>-0.027306</td>\n",
              "      <td>-0.004580</td>\n",
              "      <td>-0.016151</td>\n",
              "      <td>-0.002989</td>\n",
              "      <td>0.004683</td>\n",
              "      <td>-0.008040</td>\n",
              "      <td>-0.011188</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>15</th>\n",
              "      <td>0.028347</td>\n",
              "      <td>0.536930</td>\n",
              "      <td>0.027382</td>\n",
              "      <td>0.537159</td>\n",
              "      <td>0.032957</td>\n",
              "      <td>0.524090</td>\n",
              "      <td>0.038999</td>\n",
              "      <td>0.518719</td>\n",
              "      <td>0.037088</td>\n",
              "      <td>0.527366</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>16</th>\n",
              "      <td>0.189704</td>\n",
              "      <td>0.830458</td>\n",
              "      <td>0.185066</td>\n",
              "      <td>0.845195</td>\n",
              "      <td>0.182196</td>\n",
              "      <td>0.843201</td>\n",
              "      <td>0.182746</td>\n",
              "      <td>0.841481</td>\n",
              "      <td>0.191452</td>\n",
              "      <td>0.828862</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>17</th>\n",
              "      <td>-0.042574</td>\n",
              "      <td>-0.001307</td>\n",
              "      <td>-0.036587</td>\n",
              "      <td>0.025602</td>\n",
              "      <td>-0.036717</td>\n",
              "      <td>0.048637</td>\n",
              "      <td>-0.042817</td>\n",
              "      <td>0.052739</td>\n",
              "      <td>-0.052082</td>\n",
              "      <td>0.023297</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>18</th>\n",
              "      <td>0.038967</td>\n",
              "      <td>0.930852</td>\n",
              "      <td>0.041272</td>\n",
              "      <td>0.926384</td>\n",
              "      <td>0.039467</td>\n",
              "      <td>0.916860</td>\n",
              "      <td>0.035485</td>\n",
              "      <td>0.918129</td>\n",
              "      <td>0.032661</td>\n",
              "      <td>0.920337</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>19</th>\n",
              "      <td>0.004137</td>\n",
              "      <td>-0.020264</td>\n",
              "      <td>0.001758</td>\n",
              "      <td>0.000139</td>\n",
              "      <td>0.003657</td>\n",
              "      <td>-0.004372</td>\n",
              "      <td>0.003317</td>\n",
              "      <td>0.001623</td>\n",
              "      <td>0.006790</td>\n",
              "      <td>0.009386</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-706b1cb1-8650-4457-ae32-b51f6fb639b9')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-706b1cb1-8650-4457-ae32-b51f6fb639b9 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-706b1cb1-8650-4457-ae32-b51f6fb639b9');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-8b5679e3-b4ab-49a0-a106-19e27a42b5b1\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-8b5679e3-b4ab-49a0-a106-19e27a42b5b1')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-8b5679e3-b4ab-49a0-a106-19e27a42b5b1 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ]
          },
          "metadata": {},
          "execution_count": 90
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "def calculate_error(output , label_data) :\n",
        "\n",
        "  output = np.array(output)\n",
        "  final_output = np.zeros((output.shape[2],output.shape[0]))\n",
        "  for i in range(output.shape[2]):\n",
        "    final_output[i:] = output[:,0,i]\n",
        "\n",
        "  final_output = pd.DataFrame(final_output)\n",
        "\n",
        "  error = 0.0\n",
        "  for i in range(20):\n",
        "    for j in range(10):\n",
        "      f = final_output.iloc[i, j]\n",
        "      s = label_data.iloc[i, j]\n",
        "\n",
        "      if s != 0:\n",
        "        error += (f - s) ** 2\n",
        "\n",
        "  return error"
      ],
      "metadata": {
        "id": "C3fDulX5fzG3"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "def get_label_data(path) :\n",
        "  label_data_x , label_data_y = excel_to_data(path)\n",
        "  label_data = np.zeros((20,10))\n",
        "  for i in range(20) :\n",
        "    ct = 0\n",
        "    for j1, j2 in zip(range(45,50), range(45,50)):\n",
        "      label_data[i][ct] = label_data_x[i][j1]\n",
        "      ct+=1\n",
        "      label_data[i][ct] = label_data_y[i][j2]\n",
        "      ct+=1\n",
        "\n",
        "  label_data = pd.DataFrame(label_data)\n",
        "  return label_data"
      ],
      "metadata": {
        "id": "MkkNf1CjahTZ"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "label_data = get_label_data(\"/content/drive/MyDrive/miniproj_all_cordi/xy10.xlsx\")"
      ],
      "metadata": {
        "id": "1ch2SW27VdxN"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "label_data"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 676
        },
        "id": "ox4jOSnBl-o8",
        "outputId": "ea62a68d-c7f9-4671-bba3-94c76c98cad1"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "           0         1         2         3         4         5         6  \\\n",
              "0   0.424837  0.835244  0.415500  0.840974  0.406162  0.845272  0.402428   \n",
              "1   0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000   \n",
              "2   0.999066  0.280802  0.999066  0.282235  0.999066  0.282235  0.999066   \n",
              "3   0.030812  0.514327  0.029879  0.514327  0.029879  0.514327  0.029879   \n",
              "4   0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000   \n",
              "5   0.977591  0.296562  0.977591  0.296562  0.977591  0.296562  0.977591   \n",
              "6   0.765640  0.501433  0.770308  0.500000  0.774043  0.497135  0.775910   \n",
              "7   0.011204  0.472779  0.011204  0.474212  0.011204  0.474212  0.011204   \n",
              "8   0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000   \n",
              "9   0.785247  0.573066  0.781513  0.574499  0.778711  0.577364  0.777778   \n",
              "10  0.521008  0.851003  0.521008  0.851003  0.521008  0.851003  0.521008   \n",
              "11  0.577031  0.657593  0.571429  0.660458  0.565826  0.663324  0.563959   \n",
              "12  0.499533  0.763610  0.492063  0.766476  0.487395  0.769341  0.484594   \n",
              "13  0.598506  0.690544  0.592904  0.693410  0.589169  0.694842  0.587302   \n",
              "14  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000   \n",
              "15  0.063492  0.554441  0.063492  0.554441  0.063492  0.554441  0.063492   \n",
              "16  0.170868  0.873926  0.163399  0.876791  0.157796  0.878223  0.154995   \n",
              "17  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000   \n",
              "18  0.052288  0.979943  0.048553  0.982808  0.044818  0.982808  0.042951   \n",
              "19  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000   \n",
              "\n",
              "           7         8         9  \n",
              "0   0.848138  0.391223  0.853868  \n",
              "1   0.000000  0.000000  0.000000  \n",
              "2   0.282235  0.999066  0.283668  \n",
              "3   0.514327  0.030812  0.514327  \n",
              "4   0.000000  0.000000  0.000000  \n",
              "5   0.296562  0.977591  0.296562  \n",
              "6   0.495702  0.780579  0.492837  \n",
              "7   0.474212  0.011204  0.474212  \n",
              "8   0.000000  0.000000  0.000000  \n",
              "9   0.577364  0.773109  0.580229  \n",
              "10  0.851003  0.521008  0.851003  \n",
              "11  0.664756  0.557423  0.669054  \n",
              "12  0.769341  0.477124  0.775072  \n",
              "13  0.696275  0.580766  0.700573  \n",
              "14  0.000000  0.000000  0.000000  \n",
              "15  0.554441  0.063492  0.554441  \n",
              "16  0.879656  0.145658  0.886819  \n",
              "17  0.000000  0.000000  0.000000  \n",
              "18  0.984241  0.039216  0.987106  \n",
              "19  0.000000  0.000000  0.000000  "
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-870cdeec-e4eb-4dca-bdd4-cddcd0cfe731\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>0</th>\n",
              "      <th>1</th>\n",
              "      <th>2</th>\n",
              "      <th>3</th>\n",
              "      <th>4</th>\n",
              "      <th>5</th>\n",
              "      <th>6</th>\n",
              "      <th>7</th>\n",
              "      <th>8</th>\n",
              "      <th>9</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0.424837</td>\n",
              "      <td>0.835244</td>\n",
              "      <td>0.415500</td>\n",
              "      <td>0.840974</td>\n",
              "      <td>0.406162</td>\n",
              "      <td>0.845272</td>\n",
              "      <td>0.402428</td>\n",
              "      <td>0.848138</td>\n",
              "      <td>0.391223</td>\n",
              "      <td>0.853868</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>0.999066</td>\n",
              "      <td>0.280802</td>\n",
              "      <td>0.999066</td>\n",
              "      <td>0.282235</td>\n",
              "      <td>0.999066</td>\n",
              "      <td>0.282235</td>\n",
              "      <td>0.999066</td>\n",
              "      <td>0.282235</td>\n",
              "      <td>0.999066</td>\n",
              "      <td>0.283668</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>0.030812</td>\n",
              "      <td>0.514327</td>\n",
              "      <td>0.029879</td>\n",
              "      <td>0.514327</td>\n",
              "      <td>0.029879</td>\n",
              "      <td>0.514327</td>\n",
              "      <td>0.029879</td>\n",
              "      <td>0.514327</td>\n",
              "      <td>0.030812</td>\n",
              "      <td>0.514327</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>5</th>\n",
              "      <td>0.977591</td>\n",
              "      <td>0.296562</td>\n",
              "      <td>0.977591</td>\n",
              "      <td>0.296562</td>\n",
              "      <td>0.977591</td>\n",
              "      <td>0.296562</td>\n",
              "      <td>0.977591</td>\n",
              "      <td>0.296562</td>\n",
              "      <td>0.977591</td>\n",
              "      <td>0.296562</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>6</th>\n",
              "      <td>0.765640</td>\n",
              "      <td>0.501433</td>\n",
              "      <td>0.770308</td>\n",
              "      <td>0.500000</td>\n",
              "      <td>0.774043</td>\n",
              "      <td>0.497135</td>\n",
              "      <td>0.775910</td>\n",
              "      <td>0.495702</td>\n",
              "      <td>0.780579</td>\n",
              "      <td>0.492837</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>7</th>\n",
              "      <td>0.011204</td>\n",
              "      <td>0.472779</td>\n",
              "      <td>0.011204</td>\n",
              "      <td>0.474212</td>\n",
              "      <td>0.011204</td>\n",
              "      <td>0.474212</td>\n",
              "      <td>0.011204</td>\n",
              "      <td>0.474212</td>\n",
              "      <td>0.011204</td>\n",
              "      <td>0.474212</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>8</th>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>9</th>\n",
              "      <td>0.785247</td>\n",
              "      <td>0.573066</td>\n",
              "      <td>0.781513</td>\n",
              "      <td>0.574499</td>\n",
              "      <td>0.778711</td>\n",
              "      <td>0.577364</td>\n",
              "      <td>0.777778</td>\n",
              "      <td>0.577364</td>\n",
              "      <td>0.773109</td>\n",
              "      <td>0.580229</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>10</th>\n",
              "      <td>0.521008</td>\n",
              "      <td>0.851003</td>\n",
              "      <td>0.521008</td>\n",
              "      <td>0.851003</td>\n",
              "      <td>0.521008</td>\n",
              "      <td>0.851003</td>\n",
              "      <td>0.521008</td>\n",
              "      <td>0.851003</td>\n",
              "      <td>0.521008</td>\n",
              "      <td>0.851003</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>11</th>\n",
              "      <td>0.577031</td>\n",
              "      <td>0.657593</td>\n",
              "      <td>0.571429</td>\n",
              "      <td>0.660458</td>\n",
              "      <td>0.565826</td>\n",
              "      <td>0.663324</td>\n",
              "      <td>0.563959</td>\n",
              "      <td>0.664756</td>\n",
              "      <td>0.557423</td>\n",
              "      <td>0.669054</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>12</th>\n",
              "      <td>0.499533</td>\n",
              "      <td>0.763610</td>\n",
              "      <td>0.492063</td>\n",
              "      <td>0.766476</td>\n",
              "      <td>0.487395</td>\n",
              "      <td>0.769341</td>\n",
              "      <td>0.484594</td>\n",
              "      <td>0.769341</td>\n",
              "      <td>0.477124</td>\n",
              "      <td>0.775072</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>13</th>\n",
              "      <td>0.598506</td>\n",
              "      <td>0.690544</td>\n",
              "      <td>0.592904</td>\n",
              "      <td>0.693410</td>\n",
              "      <td>0.589169</td>\n",
              "      <td>0.694842</td>\n",
              "      <td>0.587302</td>\n",
              "      <td>0.696275</td>\n",
              "      <td>0.580766</td>\n",
              "      <td>0.700573</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>14</th>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>15</th>\n",
              "      <td>0.063492</td>\n",
              "      <td>0.554441</td>\n",
              "      <td>0.063492</td>\n",
              "      <td>0.554441</td>\n",
              "      <td>0.063492</td>\n",
              "      <td>0.554441</td>\n",
              "      <td>0.063492</td>\n",
              "      <td>0.554441</td>\n",
              "      <td>0.063492</td>\n",
              "      <td>0.554441</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>16</th>\n",
              "      <td>0.170868</td>\n",
              "      <td>0.873926</td>\n",
              "      <td>0.163399</td>\n",
              "      <td>0.876791</td>\n",
              "      <td>0.157796</td>\n",
              "      <td>0.878223</td>\n",
              "      <td>0.154995</td>\n",
              "      <td>0.879656</td>\n",
              "      <td>0.145658</td>\n",
              "      <td>0.886819</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>17</th>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>18</th>\n",
              "      <td>0.052288</td>\n",
              "      <td>0.979943</td>\n",
              "      <td>0.048553</td>\n",
              "      <td>0.982808</td>\n",
              "      <td>0.044818</td>\n",
              "      <td>0.982808</td>\n",
              "      <td>0.042951</td>\n",
              "      <td>0.984241</td>\n",
              "      <td>0.039216</td>\n",
              "      <td>0.987106</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>19</th>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "      <td>0.000000</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-870cdeec-e4eb-4dca-bdd4-cddcd0cfe731')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-870cdeec-e4eb-4dca-bdd4-cddcd0cfe731 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-870cdeec-e4eb-4dca-bdd4-cddcd0cfe731');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-b4d017fe-f20c-4196-af7d-5559ab2316a9\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-b4d017fe-f20c-4196-af7d-5559ab2316a9')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-b4d017fe-f20c-4196-af7d-5559ab2316a9 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "\n",
              "  <div id=\"id_333adca8-7c36-46c5-a49b-e471323dd51b\">\n",
              "    <style>\n",
              "      .colab-df-generate {\n",
              "        background-color: #E8F0FE;\n",
              "        border: none;\n",
              "        border-radius: 50%;\n",
              "        cursor: pointer;\n",
              "        display: none;\n",
              "        fill: #1967D2;\n",
              "        height: 32px;\n",
              "        padding: 0 0 0 0;\n",
              "        width: 32px;\n",
              "      }\n",
              "\n",
              "      .colab-df-generate:hover {\n",
              "        background-color: #E2EBFA;\n",
              "        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "        fill: #174EA6;\n",
              "      }\n",
              "\n",
              "      [theme=dark] .colab-df-generate {\n",
              "        background-color: #3B4455;\n",
              "        fill: #D2E3FC;\n",
              "      }\n",
              "\n",
              "      [theme=dark] .colab-df-generate:hover {\n",
              "        background-color: #434B5C;\n",
              "        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "        fill: #FFFFFF;\n",
              "      }\n",
              "    </style>\n",
              "    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('label_data')\"\n",
              "            title=\"Generate code using this dataframe.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "       width=\"24px\">\n",
              "    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "    <script>\n",
              "      (() => {\n",
              "      const buttonEl =\n",
              "        document.querySelector('#id_333adca8-7c36-46c5-a49b-e471323dd51b button.colab-df-generate');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      buttonEl.onclick = () => {\n",
              "        google.colab.notebook.generateWithVariable('label_data');\n",
              "      }\n",
              "      })();\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ]
          },
          "metadata": {},
          "execution_count": 94
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "print(calculate_error(output , label_data))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Y_AlIuIcbIc6",
        "outputId": "982b4c98-314f-4043-ea0c-0367ba7f86a2"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "0.2146436989376989\n"
          ]
        }
      ]
    }
  ]
}